جزوه · فرمان xargs ← بازگشت به فهرست
📘 فصل اول · قسمت هجدهم فرمان xargs
📅 تاریخ: ۱۹ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian

▍ مقدمه

xargs یکی از ابزارهای قدرتمند لینوکس است که ورودی استاندارد (STDIN) را به آرگومان (Argument) برای یک فرمان تبدیل می‌کند.

🔑 مفهوم اصلی:

بعضی از دستورات مثل rm، mkdir، cp و ... نمی‌توانند ورودی را از Pipe بگیرند. xargs این مشکل را حل می‌کند و خروجی Pipe را به عنوان آرگومان خط فرمان به آن دستورات می‌دهد.

▍ ساختار کلی

command1 | xargs [options] command2

توضیح: خروجی command1 به عنوان ورودی xargs می‌رود و xargs آن را به عنوان آرگومان به command2 می‌دهد.

▍ تفاوت Pipe و xargs

ویژگی Pipe (|) xargs
نحوه ارسال خروجی را به عنوان ورودی استاندارد (STDIN) می‌دهد خروجی را به عنوان آرگومان خط فرمان می‌دهد
مناسب برای دستوراتی که STDIN می‌خوانند (مثل grep, wc) دستوراتی که آرگومان می‌خوانند (مثل rm, mkdir)
مثال ls | grep ".txt" ls | xargs rm

▍ مثال‌های پایه

• حذف فایل‌ها

┌──(ya3in㉿kali)-[~] └─$ find . -name "*.tmp" | xargs rm

توضیح: همه فایل‌های .tmp را پیدا کرده و حذف می‌کند.

┌──(ya3in㉿kali)-[~] └─$ ls *.txt | xargs rm

توضیح: همه فایل‌های .txt را حذف می‌کند.

• ایجاد دایرکتوری‌ها

┌──(ya3in㉿kali)-[~] └─$ echo "dir1 dir2 dir3" | xargs mkdir

توضیح: سه دایرکتوری dir1، dir2 و dir3 را ایجاد می‌کند.

• شمارش فایل‌ها

┌──(ya3in㉿kali)-[~] └─$ find . -name "*.txt" | xargs wc -l

توضیح: تعداد خطوط همه فایل‌های .txt را نشان می‌دهد.

▍ گزینه‌های مهم xargs

گزینه توضیح مثال
-n N هر بار N آرگومان به دستور بده ls | xargs -n 2 echo
-p قبل از اجرا تأیید بگیر (Prompt) ls | xargs -p rm
-t دستور را قبل از اجرا چاپ کن (Trace) ls | xargs -t rm
-0 ورودی را با کاراکتر null جدا کن (برای نام‌های با فاصله) find . -name "*.txt" -print0 | xargs -0 rm
-I REPLACE جایگزینی الگو در دستور ls | xargs -I {} mv {} {}.bak
-P N اجرای همزمان با N پردازه (Parallel) ls | xargs -P 4 -n 1 wc
--max-args همان -n ls | xargs --max-args=3 echo
--replace همان -I ls | xargs --replace={} mv {} {}.old

▍ مثال‌های پیشرفته

• -n (تعداد آرگومان‌ها)

┌──(ya3in㉿kali)-[~] └─$ echo 1 2 3 4 5 6 | xargs -n 2 echo 1 2
3 4
5 6

توضیح: هر بار ۲ عدد را به echo می‌دهد.

• -I (جایگزینی الگو)

┌──(ya3in㉿kali)-[~] └─$ ls *.txt | xargs -I {} mv {} {}.bak

توضیح: همه فایل‌های .txt را به .txt.bak تغییر نام می‌دهد. {} به جای نام فایل قرار می‌گیرد.

┌──(ya3in㉿kali)-[~] └─$ ls | xargs -I FILE echo "Processing: FILE" Processing: file1.txt
Processing: file2.txt
Processing: file3.txt

توضیح: -I FILE یعنی هر جایی که FILE باشد، با نام فایل جایگزین می‌شود.

• -p (تأیید قبل از اجرا)

┌──(ya3in㉿kali)-[~] └─$ ls *.log | xargs -p rm rm file1.log file2.log ?...

توضیح: قبل از حذف، از شما تأیید می‌گیرد.

• -0 (برای نام‌های با فاصله)

┌──(ya3in㉿kali)-[~] └─$ find . -name "*.txt" -print0 | xargs -0 rm

توضیح: اگر نام فایل‌ها شامل فاصله باشد، این روش آنها را به‌درستی پردازش می‌کند.

• -P (اجرای موازی)

┌──(ya3in㉿kali)-[~] └─$ ls *.txt | xargs -P 4 -n 1 wc

توضیح: ۴ تا wc را به صورت همزمان اجرا می‌کند (هر کدام روی یک فایل).

▍ موارد کاربردی در مدیریت سیستم

┌──(ya3in㉿kali)-[~] └─$ ps aux | grep "firefox" | awk '{print $2}' | xargs kill -9

توضیح: پیدا کردن PIDهای firefox و کشتن آنها.

┌──(ya3in㉿kali)-[~] └─$ find /var/log -name "*.log" -mtime +7 | xargs rm

توضیح: حذف فایل‌های لاگ قدیمی‌تر از ۷ روز.

┌──(ya3in㉿kali)-[~] └─$ cat urls.txt | xargs -n 1 curl -O

توضیح: دانلود همه فایل‌های موجود در urls.txt با curl.

⚠️ نکات ایمنی:
  • قبل از دستوراتی مثل rm، از -p یا -t استفاده کنید تا مطمئن شوید.
  • برای نام‌های با فاصله، همیشه از -0 با find -print0 استفاده کنید.
  • با -P مراقب باشید که سیستم شما توانایی اجرای همزمان را داشته باشد.

▍ مقایسه xargs با find -exec

ویژگی xargs find -exec
سرعت سریع‌تر (اجرای یکباره) کندتر (اجرای جداگانه برای هر فایل)
نام‌های با فاصله با -0 کار می‌کند به‌خوبی کار می‌کند
استفاده با هر دستوری فقط با find
مثال find . -name "*.txt" | xargs rm find . -name "*.txt" -exec rm {} \;
💡 انتخاب مناسب:
  • اگر با فایل‌های زیادی کار می‌کنید و نام‌ها فاصله ندارندxargs
  • اگر نام‌ها فاصله دارندfind -exec یا xargs -0
  • اگر فقط با find کار می‌کنید → -exec راحت‌تر است
✅ تمرین پیشنهادی:
  • با ls *.txt | xargs wc تعداد خطوط فایل‌های .txt را بشمارید.
  • با echo "file1 file2 file3" | xargs touch سه فایل بسازید.
  • با ls | xargs -I {} echo "File: {}" یک پیام برای هر فایل چاپ کنید.
  • با find . -name "*.tmp" | xargs -p rm فایل‌های .tmp را با تأیید حذف کنید.
  • با ls -la | grep "^-" | awk '{print $9}' | xargs -n 1 file نوع فایل‌ها را ببینید.